//购物车仓库
import { reqShopCartList, reqDeleteCartById, reqUpdateCartChecked } from '@/api';
//引入创建临时身份模块
import {userTemp} from '@/utils/temp_token'
//购物车的仓库
const state = {
    //程序运行起来的时候，仓库已经有了，用户临时身份存储到vuex中
    userTempId: userTemp(),
    //当前临时用户的购物车数据
    shopList: [],

}
const mutations = {
    GETSHOPCART(state, shopList) {
        state.shopList = shopList;
    }
};
const actions = {
    async getShopCartData({commit}) {
        let result = await reqShopCartList();
        //测试打印获取到的购物车数据
        // console.log(result.data);
        if (result.code == 200) {
            commit("GETSHOPCART", result.data)
        }
    },
    //删除某一个产品的操作
    //一定要切记：action第一个参数（minstore）第二个参数：dispatch的载荷（传递过来的数据）
    async deleteCart({commit }, skuId) {
        //删除某一款产品的接口；服务器会通知删除成功与失败
        let result = await reqDeleteCartById(skuId);
        //删除购物车函数：也需要返回成功与失败的标记，因为组件那里需要知道删除成功，失败
        if (result.code == 200) {
            return 'ok'
        } else {
            return Promise.reject(new Error('faile'));
        }
    },
    //修改某一个产品选中和未选中的状态
    async updateChecked({commit }, {skuId,isChecked }) {
        let result = await reqUpdateCartChecked(skuId, isChecked)
        // console.log(result);
        //修改成功
        if (result.code == 200) {
            return 'ok'
        } else {
            return Promise.reject(new Error('faile'));
        }
    },
    //修改全部的产品选中状态的方法
    //在action 当中如何获取到仓库中的存储数据
    //1：获取到全部购物车的数据【数组：六个元素】
    //2：触发updateChecked这个action六次【全部产品都修改了】
    //3：updateAllCart,返回一个Promise告诉组件成功了，还是失败了【组件才能继续写别的业务】
    updateAllCart({ getters, dispatch,commit}, isChecked) {
        //minStore:获得仓库中的state,计算属性的getters
        //minStore:dispatch方法可以派发action
        //commit:提交mutation，修改state 
        //遍历购物车里面的产品：购物车里面有多少产品，回调就执行多少次，
        let arr = [];
        getters.shopCartData.cartInfoList.forEach(cart => {
            //在当前的action内部，调用顶部action 执行n次
            let promise = dispatch('updateChecked',{skuId:cart.skuId,isChecked});
            arr.push(promise);
            //如果不书写return ,返回的结果永远都是undefined，永远都是真
            //Promise.all执行，参数需要的一个数组，数组里面的每一个都是promise,如果都成功，promise返回即为成功结果
            //如果有一个【修改状态】promise失败返回结果即为失败
        })
        return Promise.all(arr);//可以保证updateAllCart 返回的是promise【成功，失败】
    },
    //删除选中的全部商品
    deleteCartByChecked({getters,dispatch}){
     //获取购物车里全部的商品进行遍历
        let arr = [];
        getters.shopCartData.cartInfoList.forEach(item=>{
            //如果被选中的产品才会删除
            if(item.isChecked ==1){
                let promise = dispatch("deleteCart",item.skuId);
                arr.push(promise);
            }
            
        });
        return Promise.all(arr);
    }
};
const getters = {
    //简化购物车中的数据
    //当前购物车模块中的state并非大仓库中state数据【只是包含购物车state数据】
    shopCartData(state) {
        return state.shopList[0] || {}
    },
    // shopList(shopList){
    //     return shopList.cartInfoList||[]
    // }
}
export default {
    state,
    mutations,
    actions,
    getters
}